﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication27
{
    public partial class Liczba
    {

        public static Liczba operator *(Liczba a, Liczba b)
        {
            List<ulong> wynik = new List<ulong>();
            if (a.element[0] == 0 || b.element[0] == 0) return new Liczba(a.system);
           

            ulong reszta = 0;
            ulong wynikdodawania = 0;
            int ilosczer = 0;
            Liczba c=new Liczba(a.system);
            Liczba cc = new Liczba(a.system);
            

            int coprzezco = Pomoce.Porownaj(a, b);
            if (coprzezco == 0) { cc = a; a = b; b = cc; }
            


            for (int i = b.element.Count-1; i >=0; i--)
            {
                for (int j = a.element.Count-1; j >=0 ; j--)
                {
                    ulong posredni = a.element[j] * b.element[i] + reszta;
                    wynikdodawania = posredni % a.system;
                    reszta = posredni / a.system;

                    wynik.Add(wynikdodawania);
                }
                if (reszta != 0) wynik.Add(reszta);
               

                wynik.Reverse();

                for (int z = 0; z < ilosczer; z++) wynik.Add(0);
                ilosczer++;

                Liczba wyniktemporary = new Liczba(wynik,a.system);
                reszta = 0;
                
                c = c + wyniktemporary;
                wynik = new List<ulong>();
              
                

            }
            if (a.znak == b.znak) c.znak = a.znak; else c.znak = '-';
            return c;


           

        }

        

      /*  public static Liczba Karatsuba(Liczba a, Liczba b)
        {
            int ma = a.element.Count / 2;
            int mb = b.element.Count / 2;

            List<ulong> temp=new List<ulong>();
            temp.Add((ulong)ma);
            Liczba malist=new Liczba(temp);

            temp=new List<ulong>();
            temp.Add((ulong)ma);
            Liczba mblist=new Liczba(temp);


       


            Liczba x1=new Liczba();
            Liczba y1=new Liczba();

            temp=new List<ulong>();
            temp.Add(a.system);
            Liczba system=new Liczba(temp);


            temp=new List<ulong>(); 

            for (int i = 0; i < ma; i++)
            {
               
                temp.Add(a.element[i]);

            }
            x1.element=temp;
            

            temp=new List<ulong>(); 

            for (int i = 0; i < mb; i++)
            {
               
                temp.Add(b.element[i]);

            }
            y1.element=temp;

            Liczba x2=new Liczba();
            Liczba y2=new Liczba();

            x2=a-(system*malist);
            y2=b - (system * mblist);

            Liczba x = x1 * y1;
            Liczba y = x2 * y2;
            Liczba z = (x1 + y1) * (x2 + y2) - x - y;

            for (int i = 0; i < ma * 2; i++)
            {
                x.element.Add(0);
            }

            for (int i = 0; i < mb; i++)
            {
                z.element.Add(0);
            }

            return x + y + z;



        }
       */

    }
}
